#include <iomanip>
#include <iostream>
using namespace std;
// g++ -o test_reference test_reference.cc -std=c++11
int num = 99;

class A {
 public:
  A() : n(0), r(num) {}

 private:
  int n;
  int &r;
};
void test1() {
  A *a = new A();
  cout << sizeof(A) << endl;  //输出A类型的大小
  cout << hex << showbase << *((int *)a + 1)
       << endl;  //输出r本身的内容,r中的值就是num的内存地址
  cout << &num << endl;  //输出num变量的地址
  delete a;
}

int func(int &a, int &b) { return a + b; }
void test2() {
  int a = 3, b = 5;
  // func(3, 5);  // 编译错误，立即数无法寻址
  // func(a + 2, b);  //
  // 编译错误，a+2为常量表达式，计算结果存于寄存器中，无法寻址
  // func(a, a + b);  // 编译错误，原因同上
  func(a, b);  // 正确
  // int &c = func(a, b);
  // 编译错误，因为func返回的是一个右值（临时变量)，不能与左值引用绑定

  int n = 100, m = 200;
  // 这些基础类型的临时结果无法寻址
  // int *p1 = &(m + n);    // m + n 的结果为 300，编译错误
  // int *p2 = &(n + 100);  // n + 100 的结果为 200，编译错误
  // bool *p4 = &(m < n);   // m < n 的结果为 false，编译错误
}
int main() {
  test1();
  test2();
  return 0;
}
// TODO: test1答案与预期不同